package top.csy8888.rabbitmq.demo;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * @author CSY
 * @date 2025 - 10 - 09
 * 消息生产者
 */
public class Producer {
    /**
     * 队列名称
     */
    private static final String QUEUE_NAME = "test";
    /**
     * 连接工厂
     */
    private static final ConnectionFactory connectionFactory;

    /**
     * 初始化连接工厂
     */
    static {
        connectionFactory = new ConnectionFactory();
        //设置本机地址
        connectionFactory.setHost("127.0.0.1");
        //5672是客户端访问端口，15672是控制台网页访问端口
        //设置访问端口
        connectionFactory.setPort(5672);
    }

    /**
     * 发送消息
     * @param message
     * @throws Exception
     */
    public static void send(String message) {
        // 创建连接
        try(Connection connection = connectionFactory.newConnection();
            // 使用连接对象构建一个消息通信的通道（Channel）
            Channel channel = connection.createChannel()) {
            // 创建队列
            // 参数一：队列的名称
            // 参数二：队列是否持久化 - true表示持久化
            // 参数三：是否排他（true表示排他），
            //       排他性指的是队列只对首次创建的Connection可见，
            //       false表示可以被所有Connection可见
            // 参数四：设置为true表示断开连接时，自动删除队列
            // 参数五：队列的其他属性设置，是一个map集合
            channel.queueDeclare(QUEUE_NAME,false,false,false,null);

            // 投递消息
            // 参数一：交换机的名称，设置为""表示未指定交换机的名称
            //        此时rabbitmq通过一个默认的交换机来路由消息
            // 参数二：队列的名称 - 将消息投递到指定队列中
            // 参数三：消息头的属性信息，如果没有设置为null
            // 参数四：消息内容，必须将消息转换为字节数组再投递
            channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
        }catch (Exception e){
            throw new RuntimeException("操作失败",e);
        }
    }

    public static void main(String[] args) {
        send("Hello csy");
    }
}
